// 应用程序的启动（入口文件）

// 加载express模块
var express = require('express')
var swig = require('swig')
// 加载数据库模块
var mongoose = require('mongoose')
// 记载body-parser，用来处理post提交过来的数据
var bodyParser = require('body-parser')
// 加载cookies模块
var Cookies = require('cookies');
// 创建app应用, => NodeJS Http.createServer()
var app = express()

var User = require('./models/User')
// var Category = require('./models/Category')

// 设置静态文件托管
// 当用户访问的url以public开始，那么直接返回对象__dirname + '/public'下
app.use('/public',express.static(__dirname + '/public'))

// 配置应用模板
// 定义当前应用所使用的模板引擎
// 第一个参数，模板引擎的名称，同事也是模板文件的后缀，
// 第二个参数，表示用于解析处理模板内容的方法
app.engine('html',swig.renderFile)
// 设置模板文件存放的目录，第一个参数必须是views，第二个参数是目录
app.set('views','./views')
// 注册所使用的模板引擎，第一个参数必须是 view engine ，第二个参数和app.engine这个方法中定义的模板引擎当中是一致的
app.set('view engine','html')
// 在开发过程中需要取消模板缓存的问题，这样设置，swig模板就不会有缓存了
swig.setDefaults({cache:false})

// bodyParser配置
app.use(bodyParser.urlencoded({extended:true}))

// 设置cookies
app.use(function(req,res,next){
    req.cookies = new Cookies(req,res);
    // 解析登录用户的cookies信息
    req.userInfo = {}
    if(req.cookies.get('userInfo')){
        try{
            req.userInfo = JSON.parse((req.cookies).get('userInfo'))
            // 获取登录用户的类型，是否是管理员
            User.findById(req.userInfo._id).then(function(userInfo){
                req.userInfo.isAdmin = Boolean(userInfo.isAdmin)
                next()
            })
            
        }catch(err){
            console.log(err)
            next()
        }
    }else{
        next()
    }
})

/**
 * 根据不同的功能划分不同的功能模块
 */
app.use('/admin',require('./routers/admin'))
app.use('/api',require('./routers/api'))
app.use('/',require('./routers/main'))

// 监听http请求
mongoose.connect('mongodb://localhost:27017/blog',function(err){
    if(err){
        console.log('数据库连接失败')
    }else{
        console.log('数据库连接成功')
    }
})














/**
 * 首页
 * req request对象
 * res response对象
 * next 函数
*/
// app.get('/',function(req,res,next){
//     // res.send("<h1>欢迎</h1>")
//     // 读取views目录下的指定文件，解析并返回给客户端
//     // 第一个参数：表示模板的文件，相对于views目录， views/index.html
//     // 第二个参数：传递给模板使用的数据
//     res.render('index')
// })

// app.get('/main.css',function(req,res,next){
//     res.setHeader('content-type','text/css')
//     res.send("body {background: red;}")
// })

app.listen(3006)
console.log("node is ok")
// app.listen(3000,()=>{
//     console.log("node is ok")
// })


// 用户发送http请求 --> url --> 解析路由 --> 找到匹配的规则 --> 执行指定绑定的函数 --> 返回对应内容至用户

// /public -> 静态 -> 直接读取指定目录下的文件，返回给用户
// -> 动态 -> 处理业务逻辑，加载模板，解析模板 -> 返回数据给用户
